// CellState 是一个位标志（Flags）枚举，用于表示扫雷游戏中每个格子可能处于的多种状态
// 使用 [System.Flags] 特性，表示该枚举的值可以进行“位运算”组合，允许多个状态同时存在
[System.Flags]
public enum CellState
{
	Zero,   // 周围没有地雷（数字 0，通常不显示数字）
	One,    // 周围有 1 个地雷
	Two,    // 周围有 2 个地雷
	Three,  // 周围有 3 个地雷
	Four,   // 周围有 4 个地雷
	Five,   // 周围有 5 个地雷
	Six,    // 周围有 6 个地雷

	// 从第 3 个二进制位开始，定义一些“特殊状态”，每个状态独占一个二进制位，便于位运算
	Mine = 1 << 3,          // 该格子是地雷（第 3 位，二进制值 00001000，十进制 8）
	MarkedSure = 1 << 4,    // 该格子被玩家“确定标记”为地雷（第 4 位，二进制值 00010000，十进制 16）
	MarkedUnsure = 1 << 5,  // 该格子被玩家“不确定标记”（比如标记为问号，第 5 位，二进制值 00100000，十进制 32）
	Revealed = 1 << 6,      // 该格子已经被玩家“翻开 / 揭露”（第 6 位，二进制值 01000000，十进制 64）

	// 以下是通过组合已有状态得到的复合状态（逻辑分组），便于代码中更直观地判断某一类状态
	Marked = MarkedSure | MarkedUnsure,               // 任意一种标记状态（无论是确定还是不确定，只要被标记了就算）
	MarkedOrRevealed = Marked | Revealed,             // 格子被标记了（无论哪种） 或 已经翻开了
	MarkedSureOrMine = MarkedSure | Mine              // 格子是“确定标记为地雷” 或 “实际就是地雷”
}

public static class CellStateExtensionMethods
{
	// 判断当前格子状态 s 是否包含某个目标状态 mask
	// 通过按位与运算 (s & mask)，如果结果不为 0，说明 s 中包含 mask 所代表的状态
	public static bool Is (this CellState s, CellState mask) => (s & mask) != 0;

	// 判断当前格子状态 s 是否不包含某个目标状态 mask
	// 通过按位与运算 (s & mask)，如果结果为 0，说明 s 中不包含 mask 所代表的状态
	public static bool IsNot (this CellState s, CellState mask) => (s & mask) == 0;

	// 为当前格子状态 s 添加（设置）一个额外的状态 mask
	// 通过按位或运算 (s | mask)，将 mask 的对应位设为 1，从而添加该状态
	public static CellState With (this CellState s, CellState mask) => s | mask;

	// 从当前格子状态 s 中移除（清除）一个状态 mask
	// 通过按位与非运算 (s & ~mask)，将 mask 的对应位设为 0，从而移除该状态
	public static CellState Without (this CellState s, CellState mask) => s & ~mask;
}